package org.tomcat.unit2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer {

    public static final String WEB_ROOT = "D:/ideaspace/tomcat-demo/out/production/tomcat-demo/org/tomcat/unit2";

    private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";

    private boolean shutdown = false;

    public static void main(String[] args) {
        HttpServer server = new HttpServer();
        server.await();
    }

    public void await() {
        ServerSocket serverSocket = null;
        int port = 8080;
        try {
            try {
                serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
            } catch(IOException e) {
                e.printStackTrace();
                System.exit(1);
            }
            while (!shutdown) {
                Socket socket = null;
                InputStream input = null;
                OutputStream output = null;

                try {
                    socket = serverSocket.accept();
                    input = socket.getInputStream();
                    output =socket.getOutputStream();
                    Request request = new Request(input);
                    request.parse();
                    Response response = new Response(output);
                    response.setRequest(request);
                    if(request.getUri().startsWith("/servlet")) {
                        ServletProcessor processor = new ServletProcessor();
                        processor.process(request, response);
                    } else {
                        StaticResourceProcessor processor = new StaticResourceProcessor();
                        processor.process(request, response);
                    }
                    response.sendStaticResource();
                    socket.close();
                    shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
